package com.common.service.standvalue.impl;

import com.common.converter.StandValueConverter;
import com.common.entity.standvalue.QStandValueEntity;
import com.common.entity.standvalue.StandValueEntity;
import com.common.global.BizException;
import com.common.global.CommonEnum;
import com.common.query.QueryConditionVo;
import com.common.repository.standvalue.StandValueRepository;
import com.common.requestvo.standvalue.StandValueReqVo;
import com.common.service.standvalue.StandValueService;
import com.common.vo.standvalue.StandValueVo;
import com.querydsl.core.QueryResults;
import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * @author johnny
 * @create 2021-05-18 4:03 下午
 **/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class StandValueServiceImpl implements StandValueService {

    private final JPAQueryFactory queryFactory;

    private final StandValueRepository standValueRepository;

    public StandValueServiceImpl(JPAQueryFactory queryFactory, StandValueRepository standValueRepository) {
        this.queryFactory = queryFactory;
        this.standValueRepository = standValueRepository;
    }


    @Override
    public Page<StandValueVo> listByCondition(StandValueReqVo standValueReqVo, Pageable pageable) {

        List<StandValueVo> list = new ArrayList<>();
        QStandValueEntity qStandValueEntity = QStandValueEntity.standValueEntity;

        JPAQuery<StandValueEntity> jpaQuery = queryFactory.select(qStandValueEntity)
                .from(qStandValueEntity)
                .offset(pageable.getPageNumber() * pageable.getPageSize())
                .limit(pageable.getPageSize());

        fillCondition(jpaQuery, standValueReqVo);

        QueryResults<StandValueEntity> queryResults = jpaQuery.fetchResults();

        queryResults.getResults().forEach(standValueEntity -> {
            StandValueVo standValueVo = StandValueConverter.INSTANCE.domain2vo(standValueEntity);
            list.add(standValueVo);
        });
        return new PageImpl<>(list, pageable, queryResults.getTotal());
    }

    @Override
    public void add(StandValueReqVo standValueReqVo) {
        standValueReqVo.setId(null);
        if (StringUtils.isNotEmpty(standValueReqVo.getStandValueName())) {
            StandValueEntity standValueEntity = StandValueConverter.INSTANCE.vo2domain(standValueReqVo);
            standValueRepository.save(standValueEntity);
        } else {
            throw new BizException(CommonEnum.PARAMS_SHORTAGE);
        }
    }

    @Override
    public void edit(StandValueReqVo standValueReqVo) {
        if (standValueReqVo.getId() != null && standValueReqVo.getId() != 0L) {
            if (standValueRepository.existsById(standValueReqVo.getId())) {
                StandValueEntity targetItemEntity = StandValueConverter.INSTANCE.vo2domain(standValueReqVo);
                standValueRepository.save(targetItemEntity);
            } else {
                throw new BizException(CommonEnum.ID_NOT_FIND_ENTITY);
            }
        } else {
            throw new BizException(CommonEnum.ID_NOT_NULL);
        }
    }

    @Override
    public void delete(Long id) {
        if (id != null) {
            if (standValueRepository.existsById(id)) {
                standValueRepository.deleteById(id);
            } else {
                throw new BizException(CommonEnum.ID_NOT_FIND_ENTITY);
            }
        }
    }


    @Override
    public void fillCondition(JPAQuery<StandValueEntity> jpaQuery, QueryConditionVo queryConditionVo) {
        QStandValueEntity qStandValueEntity = QStandValueEntity.standValueEntity;
        StandValueReqVo standValueReqVo = (StandValueReqVo) queryConditionVo;

        if (StringUtils.isNotEmpty(standValueReqVo.getStandValueName())) {
            jpaQuery.where(qStandValueEntity.standValueName.like("%" + standValueReqVo.getStandValueName() + "%"));
        }

    }
}